#include "Simulacion.h"

Simulacion::Simulacion(Semaforo * lecturaEntrada, Semaforo * escrituraEntrada,
		Semaforo * empezarSimulacion, Semaforo * terminarSimulacion,
		Semaforo * lecturaSalida, Semaforo * escrituraSalida) {
	//cout << "Simulador con pid : " << getpid() << endl;
	this->entrada = new Fifo(Utils::NOMBRE_ARCHIVO_ENTRADA);
	this->lectura = lecturaEntrada;
	this->escritura = escrituraEntrada;
	this->lecturaSalida = lecturaSalida;
	this->escrituraSalida = escrituraSalida;
	this->empezarSimulacion = empezarSimulacion;
	this->terminarSimulacion = terminarSimulacion;
	sim = new SimulacionHandler();
}

void Simulacion::empezar() {
	this->empezarSimulacion->p();
	//cout << "Inicio Simulacion" << endl;
	int i = 0;
	SignalHandler::getInstance()->registrarHandler(SIGINT, sim);
	while (sim->getGracefulQuit() == 0) {
		sleep(2);
		this->escritura->p();
		if (sim->getGracefulQuit() == 0) {
			Auto autoEntrando(i, this->lecturaSalida, this->escrituraSalida);
			this->ingresarAuto(&autoEntrando);
			//cout << "Vino el Auto : " << i << " a la entrada" << endl;
			i++;
		}
	}
	this->terminar();
}

void Simulacion::ingresarAuto(Auto* autoAEntrar) {
	this->lectura->v();
	int resultado = entrada->escribir((char*) autoAEntrar, sizeof(Auto));
	if (resultado == 0) {
		cout << "Error al escribir auto : " << autoAEntrar->getId() << endl;
	}
}

void Simulacion::terminar() {
	cout << "Esperamos que se cierren las puertas" << endl;
	this->terminarSimulacion->p();
	this->terminarSimulacion->p();
	this->terminarSimulacion->p();
	cout << "Se cerraron las puertas" << endl;
	SignalHandler::destruir();
	entrada->cerrar();
	entrada->eliminar();
	lectura->eliminar();
	escritura->eliminar();
	empezarSimulacion->eliminar();
	delete entrada;
}

Simulacion::~Simulacion() {

}
